package jdx_05_synchronized.jdx_06_异常与锁;

import java.util.concurrent.TimeUnit;

/*
1.在程序中出现异常，默认情况下，锁会被释放
2.所以在并发编程中，有异常的时候要多加小心，否则会发生不一致的情况

 */
public class T {
    int count = 0;
    synchronized void m(){
        System.out.println(Thread.currentThread().getName()+"开始运行...");
        while (true){
            count++;
            System.out.print(Thread.currentThread().getName()+",count="+count+"\r");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(count==5){
                int i = 5/0;//人为的创造一个异常
                System.out.println(i);
            }
        }
    }



    public static void main(String[] args) {
        T t = new T();
        Runnable runnable = () -> {
            t.m();//创建一个可以跑t.m()的类
        };

        //接下来创建两个线程
        Thread thread1 = new Thread(runnable,"线程一");
        Thread thread2 = new Thread(runnable,"线程二");
        thread1.start();//5秒的时候会抛出异常
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();//3秒之后会拿到锁，对count进行修改，但是要等5秒的时候[线程一]抛异常，[线程二]才能拿到锁，对count修改

    }
}
